package com.cskaoyan.javase.oop3._2inner._3local._2usecase;

/**
 * @description: 局部内部类的使用场景
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 局部内部类的使用场景主要有两点:
 *      1.使用局部内部类创建对象,作为方法的参数
 *      2.使用局部内部类创建对象,作为方法的返回值
 * 使用局部内部类的优点:
 *      1.它让一个类变为局部位置的类,对外部绝对隐藏
 *      2.它稍微更简单一点(后续会学习匿名内部类更加简洁)
 * 使用局部内部类的缺点:
 *      对外部隐藏导致就真的无法在外部创建对象
 * 以上,使用局部内部类的场景,当你在局部位置需要一个对象时且只是用一次,为了更简洁更快速,可以考虑局部内部类
 * 反之,如果多处使用,多次使用,就不要用局部内部类了
 *
 * 场景一: 作为方法的实参传入方法
 * 场景二: 作为方法的返回值
 *
 *
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        //常规方法调用test()方法
        test(new Student());

        //假如我希望能够重写study方法,老办法是继承然后重写该方法,朴素的办法
        test(new StudentSon());

        //使用局部内部类的方法
        class LocalStudentSon extends Student {
            @Override
            public void study() {
                System.out.println("我是局部内部类重写study方法");
            }
        }
        test(new LocalStudentSon());

    }

    public static void test(Student s) {
        s.study();
    }

    public static AbstractPerson method(){
        //方法的返回值类型是抽象类时,必须返回子类对象
        //return new Person();  常规写法
        //局部内部类的写法
        class Person extends AbstractPerson{
            @Override
            public void eat() {
                System.out.println("局部内部类的写法");
            }
        }
        return new Person();
    }

    public static ITest method2(){
        class ITestImpl implements ITest{
            @Override
            public void sleep() {
                System.out.println("睡觉了");
            }
        }
        return new ITestImpl();
    }
}

class Student {
    int age;

    public void study() {
        System.out.println("好好学习,天天向上");
    }
}

class StudentSon extends Student {
    @Override
    public void study() {
        System.out.println("我不想学习了!");
    }
}

abstract class AbstractPerson {
    public abstract void eat();
}

interface ITest {
    void sleep();
}

class Person extends AbstractPerson{
    @Override
    public void eat() {
        System.out.println("好好吃饭,好好长胖");
    }
}